В этом шаге попробуем загрузить из файла координаты вершин и нормалей и нарисовать сложную поверхность. Возьмем чистый Win32 проект. Для упрощения жизни будем cчитывать все вершины в статический массив (хотя по уму надо читать в более сложную систему данных, но это пример и только) Не спрашивайте меня откуда я взял файл данных. Признаюсь чесно, я его своровал где-то в сети с какого-то из многочисленных примеров по OpenGL, так что не бейте сильно.
Итак, предположим, что у нас не более чем 20000 вершин:
#define MAX_VERTS 20000
Создадим массивы вершин и нормалей:
GLfloat verts[MAX_VERTS][3]; GLfloat norms[MAX_VERTS][3];
Создадим переменную списка модели и переменную для хранения реального количества вершин и нормалей:
GLuint shape; GLuint shape_max_verts;
Справедливости ради объявим переменную - дескриптор файла:
FILE* fd;
В StartRC() добавим строки для чтения данных из файла:
GLvoid StartRC(HWND hWnd)
{
glClearColor (0.5, 0.5, 0.75, 1.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHT0);
fd = fopen("Sample.dat", "r+");
for(int i=0; i<MAX_VERTS; i++)
{
int end = fscanf(fd, "%f", &verts[i][0]);
if(end==EOF)
{
shape_max_verts = i;
break;
}
fscanf(fd, "%f", &verts[i][1]);
fscanf(fd, "%f", &verts[i][2]);
fscanf(fd, "%f", &norms[i][0]);
fscanf(fd, "%f", &norms[i][1]);
fscanf(fd, "%f", &norms[i][2]);
}
CalcList();
}
В функции формирования списка воспользуемся полученной переменной shape_max_verts:
GLvoid CalcList(void)
{
shape = glGenLists(1);
glNewList(shape, GL_COMPILE);
glBegin(GL_TRIANGLE_STRIP);
for(unsigned int i=0; i<shape_max_verts; i++)
{
glNormal3fv(norms[i]);
glVertex3fv(verts[i]);
}
glEnd();
glEndList();
}
Вот и вся подготовка, теперь просто отображаем сгенерированный список:
GLvoid Draw()
{
static GLfloat rot;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(rot, 1.0f, 1.0f, 1.0f);
glCallList(shape);
glPopMatrix();
rot++;
SwapBuffers(hDC);
}
Осталось только удалить список в StopRC():
GLvoid StopRC(HWND hWnd)
{
glDeleteLists(shape, 1);
fclose(fd);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_DEPTH_TEST);
glDisable(GL_COLOR_MATERIAL);
}